package br.unb.midialab.pianogame.model;

import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.SortedSet;
import java.util.TreeSet;

import br.unb.midialab.pianogame.main.JogoPiano;
import processing.core.PApplet;

public class Musica {
	private int BPM = 0;
	private float tickTime = 0;
	private int resolution = 0;
	public List<Nota> listaNotas = new ArrayList<Nota>();
	private int maiorNota;
	private int menorNota;
	private JogoPiano parent;
	private long tickLength;
	private String titulo = "O Sapo Não Lava o Pé";
	private String autor = "Desconhecido";
	private SortedSet<Nota> notesOnList;
	
	//mapa de teclas que estão ativas
	boolean[] keysNotePlay = new boolean[127];

	public Musica() {
		notesOnList = new TreeSet<Nota>();
	}

	public String getTitulo() {
		return titulo;
	}

	public String getAutor() {
		return autor;
	}

	public void setAutor(String autor) {
		this.autor = autor;
	}

	public List<Nota> getListaNotas() {
		return listaNotas;
	}

	public void setListaNotas(List<Nota> listaNotas) {
		this.listaNotas = listaNotas;
	}

	public long getTickLength() {
		return tickLength;
	}

	public void setTickLength(long tickLength) {
		this.tickLength = tickLength;
	}

	public JogoPiano getParent() {
		return parent;
	}

	public void setParent(JogoPiano parent) {
		this.parent = parent;
		for (Nota nota : listaNotas) {
			nota.setParent(parent);
		}
	}

	public void render() {
		for (Nota nota : listaNotas) {
			nota.draw();
		}
	}

	public int getBPM() {
		return BPM;
	}

	public void setBPM(int bPM) {
		BPM = bPM;
	}

	public float getTickTime() {
		return tickTime;
	}

	public void setTickTime(float tickTime2) {
		this.tickTime = tickTime2;
	}

	public int getResolution() {
		return resolution;
	}

	public void setResolution(int resolution) {

		this.resolution = resolution;
	}

	public int getMaiorNota() {
		return maiorNota;
	}

	public void setMaiorNota(int maiorNota) {
		this.maiorNota = maiorNota;
	}

	public int getMenorNota() {
		return menorNota;
	}

	public void setMenorNota(int menorNota) {
		this.menorNota = menorNota;
	}

	public void updateNotes(long tick) {
		for (Nota nota : listaNotas) {
			if (nota.isPlaying){
				notesOnList.add(nota);
				keysNotePlay[nota.midiKey] = true;
			}else{
				notesOnList.remove(nota);
				keysNotePlay[nota.midiKey] = false;
			}
			parent.setKeysMusicNotePlay(keysNotePlay);
			nota.update(tick);
		}
	}

	public void setTitulo(String title) {
		this.titulo = title;
	}

	public TreeSet<Nota> getNotesOnList() {
		return (TreeSet<Nota>) notesOnList;
	}

	public void setNotesOnList(TreeSet<Nota> notesOnList) {
		this.notesOnList = notesOnList;
	}

	public boolean[] getKeysNotePlay() {
		return keysNotePlay;
	}

	public void setKeysNotePlay(boolean[] keysNotePlay) {
		this.keysNotePlay = keysNotePlay;
	}
	
	

}
